package com.shujia.hw;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Arrays;
import java.util.Properties;
import java.util.Scanner;

public class FindSQLExecutor {
    public static void main(String[] args) throws ClassNotFoundException, IOException, SQLException {
        /*
            3、实现从控制台读取一个任意的SQL查询语句，通过MySQL执行得到结果并按行打印结果

            4、通过控制台输入SQL语句，完成以下SQL统计
                from(加载数据表) -> join (关联其他相关表) -> on (对关联数据进行过滤) -> where(对数据进行过滤)
                    -> group by (对数据进行分组操作)  -> having(对分组后的统计结果数据进行过滤) -> select (选择字段，及字段运算)
                        -> order by (对选择的数据进行排序) -> limit(对数据进行限制展示条数)

                1. 各姓氏人数比例
                   SELECT
                    TT1.surname
                    ,count(*)
                    FROM (
                    SELECT
                    *
                    from user t1 join sur_tbl t2 on LOCATE( t2.surname, t1.NAME )
                    and SUBSTR(t1.`name`,1,1) = SUBSTR(t2.surname,1,1)
                    ) TT1 GROUP BY TT1.surname

                2. 从16岁开始每3年为一个年龄段，统计各年龄段人数及占比

                select  flag,(flag-1)*3 + 16 as start, flag*3-1+16 as end,  num  from( select floor((age - 16)/3) + 1 as flag,count(*) as num  from user group by floor((age - 16)/3) + 1) as t

                3. 统计各年龄段用户积分最多的用户信息
                SELECT
                tt2.*
                FROM(
                select floor((age - 16)/3) + 1 as flag, max(accumulate) as max_acc
                from user
                group by floor((age - 16)/3) + 1
                ) tt1 join
                (
                select floor((T1.age - 16)/3) + 1 as flag, T1.*  from user T1
                ) tt2 On tt1.flag = tt2.flag and tt1.max_acc = tt2.accumulate

                4. 各用户类别中用户积分最多的前十人员信息


                999886	弘敬熙	18	10000	1	2023-09-14 14:10:16
                857331	汝羿晓	25	10000	1	2023-09-14 14:10:13
                837232	冉熙辰	20	10000	1	2023-09-14 14:10:13
                850309	司马湘熙	22	10000	1	2023-09-14 14:10:13

                对于该需求，需要使用排名的方式，对类别进行分组，每组内按 积分以及id进行排序从高到底 得到排名顺序 1 2 3 ...
                同时该排名数值的意义是
                    当为1 时 大于等于 用户积分和id的人员为 1
                    当为2 时 大于等于 用户积分和id的人员为 2

                SELECT
                TT.*
                FROM(
                SELECT
                t1.*
                ,(SELECT count(*)  FROM user_accumulate_less_9900 t2 WHERE t2.accumulate >= 9900 AND t1.userClazz = t2.userClazz AND t2.id >= t1.id AND t2.accumulate >= t1.accumulate ) as pm
                FROM user_accumulate_less_9900 t1 WHERE t1.accumulate >= 9900
                ) TT WHERE TT.pm <= 10


         */
        Scanner scanner = new Scanner(System.in);

        Class.forName("com.mysql.jdbc.Driver");

        Properties properties = new Properties();
        properties.load(new FileReader("redisCode/src/main/resources/mysql.properties"));
        String url = properties.getProperty("url");
        String user = properties.getProperty("user");
        String passwd = properties.getProperty("passwd");
        Connection connection = DriverManager.getConnection(url, user, passwd);


        while (true) {
            System.out.println("请输入您要查询的SQL语句：");
            if (scanner.hasNextLine()) {
                String sql = scanner.nextLine();
                System.out.println("正在查询："+sql);

                executorSQL(connection,sql);

            }
        }

    }

    public static void executorSQL(Connection connection, String sql){
        try {
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery(sql);

            // 对于查询到的结果，需要先去确定其数据格式 resultSet中的 metaData => 又称为元数据，表示对数据的描述
//            while (resultSet.next()) {
//                resultSet.getString()
//            }

            // 获取到结果集的列数量
            ResultSetMetaData metaData = resultSet.getMetaData();
            int columnCount = metaData.getColumnCount();

            String[] oneLineValue = new String[columnCount];
            while (resultSet.next()){
                // 这时，可以获取到结果中的一行数据
                for (int i = 1; i <= columnCount; i++) {
                    // 一行中单个列的数据
                    String colValue = resultSet.getString(i);// 列的下标从1开始

                    oneLineValue[i-1] = colValue;
                }
                System.out.println(Arrays.toString(oneLineValue));
            }


        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
